package com.scienzeinternazionali.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import org.apache.log4j.Logger;

import com.scienzeinternazionali.application.ConnectionManager;
import com.scienzeinternazionali.dto.Profilo;
import com.scienzeinternazionali.dto.Utente;
import com.scienzeinternazionali.exception.DataAccessException;
import com.scienzeinternazionali.exception.DataSourceException;
import com.scienzeinternazionali.exception.UtenteNonRiconosciutoException;
import com.scienzeinternazionali.util.LogFactory;

public class UtenteDAO {

		
		  private static Logger logger = LogFactory.getLogger(LogFactory.SCIENZEINTERNAZIONALI);

		  private Statement st = null;
		  private ResultSet rs = null;
		  private Connection conn = null;
		  private PreparedStatement pstm = null;

		  public void inserisciUtente(Utente utente)throws DataAccessException{
			  logger.debug("inserisciUtente IN");
			  String insert;
			  try {
				  conn = ConnectionManager.getConnection();
				  st = conn.createStatement();
					insert = "INSERT INTO login (" + 
					"username, " + // 1
					"password, " + // 2
					"nome, " + // 3
					"cognome, " + // 4
					"email, " + //5
					"indirizzo, " + // 6
					"citta, " + // 7
					"cap, " + // 8
					"provincia, " + // 9
					"telefono, " + // 10
					"profilo, " + // 11
					"data_registrazione) " + // 14
					"VALUES (?,?,?,?,?,?,?,?,?,?,?,CURDATE())";
			logger.debug("insert :" + insert);
			pstm = conn.prepareStatement(insert);
			pstm.setString(1, utente.getUsername());
			pstm.setString(2, utente.getPassword());
			pstm.setString(3, utente.getNome());
			pstm.setString(4, utente.getCognome());
			pstm.setString(5, utente.getEmail());
			pstm.setString(6, utente.getIndirizzo());
			pstm.setString(7, utente.getCitta());
			pstm.setString(8, utente.getCap());
			pstm.setString(9, utente.getProvincia());
			pstm.setString(10, utente.getRecapito());
			pstm.setObject(11, utente.getProfilo());
			pstm.executeUpdate();
			pstm.close();
			
			
			}catch (SQLException e) {
				e.printStackTrace();
				logger.fatal(e.getMessage());
				throw new DataAccessException("errore durante la registrazione");
			} catch (Exception e) {
				e.printStackTrace();
				logger.fatal(e.getMessage());
				throw new DataAccessException("errore generale durante la registrazione");
			} finally {
				ConnectionManager.closeAll(rs, pstm, conn);
				logger.debug("inserisciUser OUT");
			}
		  }

		  public void aggiornaUtente(Utente utente)throws DataAccessException{
			  logger.debug("aggiornaUtente IN");
			  String update;
			  try {
				  conn = ConnectionManager.getConnection();
				  st = conn.createStatement();
					update = "UPDATE login set " + 
					"nome = ?, " + // 1
					"cognome = ?, " + // 2
					"email = ?, " + //3
					"indirizzo = ?, " + // 4
					"citta = ?, " + // 5
					"cap = ?, " + // 6
					"provincia = ?, " + // 7
					"telefono = ? " + // 8
					"Where username = ? and password = ?";
			logger.debug("update :" + update);
			pstm = conn.prepareStatement(update);
			pstm.setString(1, utente.getNome());
			pstm.setString(2, utente.getCognome());
			pstm.setString(3, utente.getEmail());
			pstm.setString(4, utente.getIndirizzo());
			pstm.setString(5, utente.getCitta());
			pstm.setString(6, utente.getCap());
			pstm.setString(7, utente.getProvincia());
			pstm.setString(8, utente.getRecapito());
			pstm.setString(9, utente.getUsername());
			pstm.setString(10, utente.getPassword());
			pstm.executeUpdate();
			pstm.close();	
			}catch (SQLException e) {
				e.printStackTrace();
				logger.fatal(e.getMessage());
				throw new DataAccessException("errore durante l'aggiornameno dei dati");
			} catch (Exception e) {
				e.printStackTrace();
				logger.fatal(e.getMessage());
				throw new DataAccessException("errore generale durante l'aggiornamento");
			} finally {
				ConnectionManager.closeAll(rs, pstm, conn);
				logger.debug("aggiornaUser OUT");
			}
		  }

		  public void aggiornaPassword(Utente utente)throws DataAccessException{
			  logger.debug("aggiornaPassword IN");
			  logger.debug("aggiornaPassword utente "+utente.getRepassword());
			  String update;
			  try {
				  conn = ConnectionManager.getConnection();
				  st = conn.createStatement();
					update = "UPDATE login set password = ? Where username = ? and password = ?";
			logger.debug("update :" + update);
			pstm = conn.prepareStatement(update);
			pstm.setString(1, utente.getRepassword());
			pstm.setString(2, utente.getUsername());
			pstm.setString(3, utente.getPassword());
			pstm.executeUpdate();
			pstm.close();	
			}catch (SQLException e) {
				e.printStackTrace();
				logger.fatal(e.getMessage());
				throw new DataAccessException("errore durante l'aggiornameno della password");
			} catch (Exception e) {
				e.printStackTrace();
				logger.fatal(e.getMessage());
				throw new DataAccessException("errore generale durante l'aggiornamento della password");
			} finally {
				ConnectionManager.closeAll(rs, pstm, conn);
				logger.debug("aggiornaPassword OUT");
			}
		  }

			private int getMaxIdIdentita(Connection conn, Statement st, ResultSet rs){
				logger.debug("getMaxIdIdentita IN");
		        int maxId = 0;
			    try {
			        // per SQL Server, prepareStatement e LIKE sono incompatibili
			        String sql = "SELECT max( id_identita )FROM identita";
			        st = conn.createStatement();
			        rs = st.executeQuery(sql);

			        while (rs.next()) {
			        	maxId = rs.getInt(1);
				        }
			      }
			      catch (SQLException s) {
			        logger.debug("getMaxIdIdentita: " + s.getMessage());
			      }
			      finally {
			    	logger.debug("getMaxIdIdentita OUT");
//			        ConnectionManager.closeAll(rs, st, conn);
			      }
				return maxId;
			}
			public Utente getUtente(Utente utente) throws DataAccessException, UtenteNonRiconosciutoException{
				logger.debug("getUser IN");
				try {
			        String sql= "SELECT id_user,user,password, login.id_profilo,desc_profilo,nome,cognome,data_registrazione FROM login, profilo WHERE profilo.id_profilo = login.id_profilo AND user='"+utente.getUsername()+"' AND password = '"+utente.getPassword()+"'";
			        logger.debug(sql);
			        conn = ConnectionManager.getConnection();
			        st = conn.createStatement();
			        rs = st.executeQuery(sql);
			        while (rs.next()) {
			        	utente.setId_user(rs.getString(1));
			        	utente.setUsername(rs.getString(2));
			        	utente.setPassword(rs.getString(3));
			        	utente.setProfilo(new Profilo (rs.getInt(4), rs.getString(5)));
			        	utente.setNome(rs.getString(6));
			        	utente.setCognome(rs.getString(7));
			        	utente.setData_registrazione(rs.getString(8));
				    }
				}catch (DataSourceException e) {
					logger.fatal(e.getMessage());
					e.printStackTrace();
					throw new DataAccessException(e.getMessage());
				} catch (SQLException e) {
					logger.fatal(e.getMessage());
					e.printStackTrace();
					throw new UtenteNonRiconosciutoException("credenziali di accesso non valide");
				} catch (Exception e) {
					logger.fatal(e.getMessage());
					e.printStackTrace();
					throw new DataAccessException("pippo");
				} finally {
					ConnectionManager.closeAll(rs, pstm, conn);
					logger.debug("getUser OUT");
				}
				return utente;
			}
			
			public String recuperaPassword(String username, String email) throws DataAccessException, UtenteNonRiconosciutoException{
				logger.debug("recuperaPassword IN");
				String newPass = "";
				try {
			        String sql= "SELECT password FROM login where username='"+username+"' and email='"+email+"'";
			        logger.debug(sql);
			        conn = ConnectionManager.getConnection();
			        st = conn.createStatement();
			        rs = st.executeQuery(sql);
			        while (rs.next()) {
			        	newPass = rs.getString(1);
				    }
			        
				}catch (DataSourceException e) {
					logger.fatal(e.getMessage());
					e.printStackTrace();
					throw new DataAccessException(e.getMessage());
				} catch (SQLException e) {
					logger.fatal(e.getMessage());
					e.printStackTrace();
					throw new UtenteNonRiconosciutoException("credenziali di accesso non valide");
				} catch (Exception e) {
					logger.fatal(e.getMessage());
					e.printStackTrace();
					throw new DataAccessException("pippo");
				} finally {
					ConnectionManager.closeAll(rs, pstm, conn);
					logger.debug("recuperaPassword OUT");
				}
				return newPass;
			}
	}
